最後一組,我們要來做client stream對上server stream,也就是client多發對server多發,這種情況常見在聊天室的情境中。所以我們就開始吧!
首先一樣在.proto檔新增service:
service IronManService{
rpc IronMan01(IronManRequest01) returns (IronManResponse01) {}
rpc IronMan02(IronManRequest02) returns (IronManResponse02) {}
rpc Client2Servers(IronManRequest01) returns (stream IronManResponse01) {}
rpc Clients2Server(stream IronManRequest01) returns (IronManResponse01) {}
rpc Clients2Servers(stream IronManRequest01) returns (stream IronManResponse01) {}
}
然後我們在server層override一個新的method clients2server2,
由於是多次的回傳以及多次的監聽,因此我們一樣要選擇使用樣板程式來實作,所以我們寫上:
@Override
public StreamObserver<IronManProto.IronManRequest01> clients2Servers(final StreamObserver<IronManProto.IronManResponse01> responseObserver) {
return new StreamObserver<IronManProto.IronManRequest01>() {
@Override
public void onNext(IronManProto.IronManRequest01 value) {
IronManProto.IronManResponse01.Builder builder = IronManProto.IronManResponse01.newBuilder();
builder.setResult("我是server端,我收到Client的訊息: " + value.getName() + " 以及 " + value.getAge());
IronManProto.IronManResponse01 ironManResponse01 = builder.build();
responseObserver.onNext(ironManResponse01);
}
@Override
public void onError(Throwable t) {
}
@Override
public void onCompleted() {
System.out.println("接收完所有Client的request");
responseObserver.onCompleted();
}
};
}
一樣是在OnNext()中準備接收每一次client端傳來的資料,然後每收到一次資料就回傳一個response的內容給client端,注意我們的onCompleted()不能寫在這邊,因為我們每收到一次request就要回傳,如果把oncompleted()寫在這裡,那就不能達成多發的server。
所以我們這次的onCompleted()必須寫在樣板程式的onCompleted()裡面,這樣就完成我們server的設計了。